package com.tecnoagrosoft.zafra.control.activity;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.tecnoagrosoft.zafra.control.activity.R;
import com.tecnoagrosoft.zafra.control.db.GenericManager;
import com.tecnoagrosoft.zafra.control.db.GestorDB;
import com.tecnoagrosoft.zafra.control.model.android.ItemsTimeLine;
import com.tecnoagrosoft.zafra.control.utils.ExpandableListAdapter;
import com.tecnoagrosoft.zafra.control.utils.UtilsGeneric;


import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Typeface;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ExpandableListView.OnChildClickListener;

public class ResumenSeguimientoActivity extends Activity {

	private ExpandableListView lista;

	ExpandableListAdapter listAdapter;
	ExpandableListView expListView;
	List<String> listDataHeader;
	HashMap<String, List<?>> listDataChild;

	private GestorDB gestorDB;
	private GenericManager gM;
	//
	private int is_version = 1;

	// header
	// tex view
	private TextView textViewDescripcion;
	private TextView textViewSeguimiento;
	private TextView textViewResumen;
	private ImageView imagePrincipalCabecera;

	private Button addLiquidacion;
	private Button hecho;
	private EditText precioC;
	private EditText kilogramosLiquidados;
	private int idResumen;

	// totales
	private TextView textViewTotalResumenDetalle;
	private TextView textViewTotalLiquidacion;
	private TextView textViewTotalHaber;
	private TextView textViewEstimacionGanancia;
	private Long totalResumenDetalle = (long) 0.0;
	private Long totalLiquidacion = (long) 0.0;
	private Long totalhaber = (long) 0.0;
	private Long totalInversion = (long) 0.0;


	private Long gananciaEstimada = (long) 0.0;
	DecimalFormat formateador = new DecimalFormat("#,###.###");
	// fechas
	final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
	Calendar cal = Calendar.getInstance();
	final Date today = cal.getTime();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_resumen_seguimiento);

		Intent intent = getIntent();
		Bundle extra = intent.getExtras();

		if (extra == null)
			return; 

		if (extra.containsKey("id")) {
			idResumen = extra.getInt("id");
			init();

			gestorDB = new GestorDB(this);
			SQLiteDatabase db = gestorDB.getWritableDatabase();
			gM = new GenericManager(db);

			String[] columns = { "_id", "descripcion", "grano_id", "tipo_zafra" };
			Cursor ca = gM.getObjectById("resumen_seguimiento", columns, idResumen);
			textViewResumen.setText(ca.getString(ca.getColumnIndex("descripcion")));

			String[] columnsGrano = { "_id", "descripcion" };
			Cursor cg = gM.getObjectById("grano", columnsGrano, ca.getInt(ca.getColumnIndex("grano_id")));
			textViewDescripcion.setText(cg.getString(cg.getColumnIndex("descripcion")));
			cg.close();

			ca.close();
			gM.close();
			db.close();
			gestorDB.close();

			loadExpandableListView();
		}

	}

	private void init() {

		textViewDescripcion = (TextView) findViewById(R.id.descripcionRSeg);
		textViewSeguimiento = (TextView) findViewById(R.id.descripcionDetallado);
		textViewResumen = (TextView) findViewById(R.id.descripcionRSegAccion);
		imagePrincipalCabecera = (ImageView) findViewById(R.id.imageViewRSeg);
		imagePrincipalCabecera.setImageResource(R.drawable.seguimiento);

		textViewTotalResumenDetalle = (TextView) findViewById(R.id.totalResumenSeguimiento);
		textViewTotalLiquidacion = (TextView) findViewById(R.id.totalLiquidaciones);
		textViewTotalHaber = (TextView) findViewById(R.id.totalHaber);
		textViewEstimacionGanancia = (TextView) findViewById(R.id.estimacionGanancia);

		hecho = (Button) findViewById(R.id.hechoResumen);
		hecho.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub

				Intent intentNew = new Intent();
				if (idResumen != 0) {
					// intentNew.putExtra("id", idResumen.toString());
				}
				setResult(RESULT_OK, intentNew);//
				finish();

			}
		});

		addLiquidacion = (Button) findViewById(R.id.btnNuevoInsumo);
		addLiquidacion.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				dialogViewLiquidacion(0);

			}
		});

	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:

			Intent intentNew = new Intent();
			// if (idResumen != 0) {
			// intentNew.putExtra("id", idResumen.toString());
			// }
			setResult(RESULT_OK, intentNew);
										
			finish();
			// NavUtils.navigateUpTo(this,intentNew);

			return true;
		}
		return super.onOptionsItemSelected(item);

	}



	private void loadExpandableListView() {

		ArrayList<ItemsTimeLine> datosResumenDetalle = new ArrayList<ItemsTimeLine>();
		ArrayList<ItemsTimeLine> datosLiquidacionDetalle = new ArrayList<ItemsTimeLine>();

		totalResumenDetalle = totalLiquidacion = gananciaEstimada = totalhaber = totalInversion = (long) 0.0;

		listDataHeader = new ArrayList<String>();
		listDataChild = new HashMap<String, List<?>>();

		listDataHeader.add(getString(R.string.lbl_resumenDetalle));
		listDataHeader.add(getString(R.string.lbl_liquidacionDetalle));

		// formateo de fechas
		String descripcion, titulo = "";
		DateFormat dfMostrar = DateFormat.getDateInstance(DateFormat.DEFAULT);

		Date fechaCreacion = null;
		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		gM = new GenericManager(db);

		String[] columnsResumenDetalle = { "_id", "resumen_seguimiento_id", "seguimiento_de_parcela_id", "total_cargas_con_descuento", "fecha_creacion",
				"total_inversion" };

		Cursor cResumenDetalle = gM.getObjectWhere("resumen_seguimiento_detalle", columnsResumenDetalle, " resumen_seguimiento_id = " + idResumen);

		Long total_cargas_con_descuento = (long) 0;
		Long total_inversion = (long) 0;
		int contS = 0;
		String totalStr = "";
		if (cResumenDetalle.moveToFirst()) {
			do {
				contS++;
				try {

					fechaCreacion = df.parse(cResumenDetalle.getString(cResumenDetalle.getColumnIndex("fecha_creacion")));
				} catch (ParseException e) {
					Log.e(getString(R.string.falloParseo), cResumenDetalle.getString(cResumenDetalle.getColumnIndex("fecha_creacion")));
				}

				total_cargas_con_descuento = cResumenDetalle.getLong(cResumenDetalle.getColumnIndex("total_cargas_con_descuento"));
				total_inversion = cResumenDetalle.getLong(cResumenDetalle.getColumnIndex("total_inversion"));

				String[] columnsSeguimiento = { "_id", "descripcion", "abono_por_kg_ha", "cantidad_semilla_metro_lineal", "cantidad_germinada_m2" };
				Cursor cSeguimiento = gM.getObjectById("seguimiento_de_parcela", columnsSeguimiento,
						cResumenDetalle.getInt(cResumenDetalle.getColumnIndex("seguimiento_de_parcela_id")));

				totalResumenDetalle = totalResumenDetalle + total_cargas_con_descuento;
				totalInversion = totalInversion + total_inversion;

				titulo = createDescripcionSeguimiento(cSeguimiento.getString(cSeguimiento.getColumnIndex("descripcion"))).toUpperCase();
				descripcion = getString(R.string.fertilizante) + " " + cSeguimiento.getString(cSeguimiento.getColumnIndex("abono_por_kg_ha")) + " "
						+ getString(R.string.kgxha) + " | " + getString(R.string.semillaXMLineal) + " "
						+ cSeguimiento.getString(cSeguimiento.getColumnIndex("cantidad_semilla_metro_lineal")) + " | " + getString(R.string.semillaGerminaM2)
						+ " " + cSeguimiento.getString(cSeguimiento.getColumnIndex("cantidad_germinada_m2"));

				totalStr = getString(R.string.detalle_descripcion_label_cargas, formateador.format(total_cargas_con_descuento));

				datosResumenDetalle.add(new ItemsTimeLine(Integer.parseInt(cResumenDetalle.getString(0)), R.drawable.camion, titulo, descripcion, totalStr));

			} while (cResumenDetalle.moveToNext());
		} else {
			datosResumenDetalle.add(new ItemsTimeLine(0, R.drawable.no_data, getString(R.string.title_noResumen), getString(R.string.noResumen), ""));
		}
		cResumenDetalle.close();
		textViewSeguimiento.setText(contS + " " + getString(R.string.seguimiento));

		// asiento liquidacione
		String[] columnsLiquidacion = { "_id", "resumen_seguimiento_id", "precio_consignacion", "kilogramos_liquidados", "fecha_creacion","is_delete" };
		Cursor cLiquidacion = gM.getObjectWhere("asiento_liquidacion", columnsLiquidacion, " resumen_seguimiento_id = " + idResumen +" and is_delete=0 ");

		float precio;
		Long kLiquidacion = (long) 0;
		int cont = 0;

		
		if (cLiquidacion.moveToFirst()) {
			
			do {
				cont++;
				try {

					fechaCreacion = df.parse(cLiquidacion.getString(cLiquidacion.getColumnIndex("fecha_creacion")));
				} catch (ParseException e) {
					Log.e(getString(R.string.falloParseo), cLiquidacion.getString(cLiquidacion.getColumnIndex("fecha_creacion")));
				}

				kLiquidacion = cLiquidacion.getLong(cLiquidacion.getColumnIndex("kilogramos_liquidados"));
				precio = cLiquidacion.getFloat(cLiquidacion.getColumnIndex("precio_consignacion"));

				totalLiquidacion = (long) (totalLiquidacion + kLiquidacion);
				gananciaEstimada = (long) (gananciaEstimada + (kLiquidacion * precio));

				titulo = getString(R.string.liquidacion).toUpperCase() + " " + cont;
				descripcion = getString(R.string.detalle_descripcion_label_liquidacion, formateador.format(precio), formateador.format(kLiquidacion),
						(formateador.format(kLiquidacion * precio)));

				datosLiquidacionDetalle.add(new ItemsTimeLine(Integer.parseInt(cLiquidacion.getString(0)), R.drawable.personal, titulo, descripcion, dfMostrar
						.format(fechaCreacion)));

			} while (cLiquidacion.moveToNext());
		} else {
			datosLiquidacionDetalle.add(new ItemsTimeLine(0, R.drawable.no_data, getString(R.string.title_noLiquidaciones),
					getString(R.string.noLiquidaciones), ""));
		}
		cLiquidacion.close();
		// carga de gastos varios

		db.close();
		gM.close();
		gestorDB.close();

		listDataChild.put(listDataHeader.get(0), datosResumenDetalle);
		listDataChild.put(listDataHeader.get(1), datosLiquidacionDetalle);

		// inversed = false;
		lista = (ExpandableListView) findViewById(R.id.ListView_tabla_resumen);
		lista.setAdapter(new ExpandableListAdapter(this.getBaseContext(), R.layout.list_group, R.layout.list_item, listDataHeader, listDataChild) {

			@Override
			public void onCreateHeader(Object entrada, View view) {
				// TODO Auto-generated method stub

				TextView tituloHeader = (TextView) view.findViewById(R.id.lblListHeader);
				if (tituloHeader != null) {
					tituloHeader.setTypeface(null, Typeface.BOLD);
					tituloHeader.setText(entrada.toString());

				}

			}

			@Override
			public void onCreateChinldren(Object entrada, View view) {
				// TODO Auto-generated method stub
				//

				if (entrada != null) {

					TextView texto_superior_entrada = (TextView) view.findViewById(R.id.list_item_titulo);
					if (texto_superior_entrada != null)
						texto_superior_entrada.setText(((ItemsTimeLine) entrada).getTextoTitulo());

					ImageView imagen_entrada = (ImageView) view.findViewById(R.id.list_item_image);
					if (imagen_entrada != null)
						imagen_entrada.setImageResource(((ItemsTimeLine) entrada).getIdImagen());

					TextView texto_inferior_entrada = (TextView) view.findViewById(R.id.list_item_descripcion);
					if (texto_inferior_entrada != null)
						texto_inferior_entrada.setText(((ItemsTimeLine) entrada).getTextoDescripcion());

					TextView texto_fecha = (TextView) view.findViewById(R.id.list_item_fecha);
					if (texto_fecha != null)
						texto_fecha.setText(((ItemsTimeLine) entrada).getTextoFecha());
				}

			}
		});

		lista.setOnChildClickListener(new OnChildClickListener() {

			@Override
			public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {

				switch (groupPosition) {
				case 0: // insumo
					// ItemsTimeLine in = (ItemsTimeLine)
					// listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
					// dialogViewCargas(in.getId());
					break;
				case 1: // liqudacion
					ItemsTimeLine ip = (ItemsTimeLine) listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
					dialogViewLiquidacion(ip.getId());
					break;

				default:
					break;
				}

				return false;
			}
		});

		lista.setOnItemLongClickListener(new OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
				if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
					int groupPosition = ExpandableListView.getPackedPositionGroup(id);
					int childPosition = ExpandableListView.getPackedPositionChild(id);

					switch (groupPosition) {
					case 0: // insumo
						// ItemsTimeLine in = (ItemsTimeLine)
						// listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
						// deleteItems("cargas_camion", in.getId());
						//
						break;
					case 1: // liquidacion
						ItemsTimeLine ip = (ItemsTimeLine) listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
						deleteItems("asiento_liquidacion", ip.getId());
						break;

					default:
						break;
					}
					return true;
				}

				return false;
			}
		});
		// actuliazar totales

		totalhaber = totalResumenDetalle - totalLiquidacion;

		gananciaEstimada = gananciaEstimada - totalInversion;
		ContentValues reg = new ContentValues();

		reg.put("total_resumen", totalResumenDetalle);
		reg.put("total_liquidado", totalLiquidacion);
		reg.put("total_haber", totalhaber);
		reg.put("estimacion_ganancia", gananciaEstimada);
		reg.put("is_delete", 0);
		update("resumen_seguimiento", reg, idResumen);

		textViewTotalResumenDetalle.setText(formateador.format(totalResumenDetalle));
		textViewTotalLiquidacion.setText(formateador.format(totalLiquidacion));
		textViewTotalHaber.setText(formateador.format(totalhaber));
		textViewEstimacionGanancia.setText(formateador.format(gananciaEstimada));

	}

	/**
	 * metodo de actuliar
	 * 
	 * @param nameTable
	 * @param reg
	 * @param _rowIndex
	 */
	private void update(String nameTable, ContentValues reg, Integer _rowIndex) {

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();

		gM = new GenericManager(db);

		gM.updateObject(nameTable, reg, _rowIndex);

		gM.close();
		db.close();
		gestorDB.close();

	}

	/**
	 * Agregar item a la tabla especificada con los balores
	 * 
	 * @param nameTable
	 * @param reg
	 */
	private void addItems(String nameTable, ContentValues reg) {

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();

		gM = new GenericManager(db);

		gM.insertObject(nameTable, reg);
		Toast.makeText(ResumenSeguimientoActivity.this, R.string.men_new, Toast.LENGTH_SHORT).show();

		db.close();
		gM.close();
		gestorDB.close();

	}

	/**
	 * borra los item de la tabla especidifca
	 * 
	 * @param nameTable
	 * @param idTable
	 */
	private void deleteItems(final String nameTable, final Integer idTable) {

		AlertDialog.Builder dialogEliminar = new AlertDialog.Builder(this, 2);

		dialogEliminar.setIcon(android.R.drawable.ic_dialog_alert);
		dialogEliminar.setTitle(getResources().getString(R.string.delete));
		dialogEliminar.setMessage(getResources().getString(R.string.men_delete_confirmation));
		dialogEliminar.setCancelable(false);

		dialogEliminar.setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int boton) {
				
				
				
				ContentValues reg = new ContentValues();
				reg.put("is_delete", 1);
				reg.put("is_version", isVersion(idTable, nameTable) + 1);
				
				// ////////////actualiza la version
				ContentValues regVersion = new ContentValues();
				regVersion.put("is_version", isVersion(idResumen, "resumen_seguimiento") + 1);
				update("resumen_seguimiento", regVersion, idResumen);

				update(nameTable, reg, idTable);
				Toast.makeText(ResumenSeguimientoActivity.this, R.string.men_delete, Toast.LENGTH_SHORT).show();

				loadExpandableListView();

			}
		});

		dialogEliminar.setNegativeButton(android.R.string.no, null);
		dialogEliminar.show();

	}



	/**
	 * este metodo crea dialogo de gastos varios
	 */
	private void dialogViewLiquidacion(final int id) {

		final Dialog dialog = new Dialog(ResumenSeguimientoActivity.this);
		dialog.setContentView(R.layout.fragment_dialog_liquidaciones);
		dialog.setTitle(R.string.title_dialog_liquidacion_add);

		// Obtener los dasto

		precioC = (EditText) dialog.findViewById(R.id.editTextPrecio);
		kilogramosLiquidados = (EditText) dialog.findViewById(R.id.editTextKilogramoLiquidacion);

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		gM = new GenericManager(db);
		// editar
		if (id != 0) {
			dialog.setTitle(R.string.title_dialog_liquidacion_edit);
			String[] asientoColumns = { "_id", "precio_consignacion", "kilogramos_liquidados", "is_version" };
			Cursor inDe = gM.getObjectById("asiento_liquidacion", asientoColumns, id);
			if (inDe.moveToFirst()) {
				precioC.setText(inDe.getString(inDe.getColumnIndex("precio_consignacion")));
				kilogramosLiquidados.setText(inDe.getString(inDe.getColumnIndex("kilogramos_liquidados")));
				is_version = inDe.getInt(inDe.getColumnIndex("is_version"));
			}
			inDe.close();
		}

		gM.close();
		db.close();
		gestorDB.close();

		dialog.show();

		// acceptar
		Button acceptarButton = (Button) dialog.findViewById(R.id.btn_acept);
		acceptarButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// Close dialog
				
				if (validadorCampos()) {

					if ((totalLiquidacion + Integer.parseInt(kilogramosLiquidados.getText().toString())) > totalResumenDetalle) {
						kilogramosLiquidados.setError("el valor es mayor al que se puede liquidar");
						kilogramosLiquidados.requestFocus();
					} else {

						ContentValues reg = new ContentValues();
						reg.put("resumen_seguimiento_id", idResumen);
						reg.put("precio_consignacion", precioC.getText().toString());
						reg.put("kilogramos_liquidados", kilogramosLiquidados.getText().toString());

						if (id != 0) {

							reg.put("is_version", is_version + 1);
							reg.put("is_delete", 0);
							update("asiento_liquidacion", reg, id);

						} else {

							reg.put("fecha_creacion", df.format(today));
							reg.put("is_version", is_version);
							reg.put("is_delete", 0);
							addItems("asiento_liquidacion", reg);

						}
						// ////////////actualiza la version
						ContentValues regVersion = new ContentValues();
						regVersion.put("is_version", isVersion(idResumen, "resumen_seguimiento") + 1);
						update("resumen_seguimiento", regVersion, idResumen);
						// /////////////////////////////
						dialog.dismiss();
						loadExpandableListView();
					}

				}
			}

			/**
			 * valida los campos
			 * @return
			 */
			private boolean validadorCampos() {
				View focusView = null;
				boolean error = false;
				boolean cancel = false;
				precioC.setError(null);
				kilogramosLiquidados.setError(null);

				focusView = UtilsGeneric.validator(precioC, 2, 4, ResumenSeguimientoActivity.this);
				if (focusView != null){
					focusView.requestFocus();
				}
				focusView = UtilsGeneric.validator(kilogramosLiquidados, 3, 7, ResumenSeguimientoActivity.this);
				if (focusView != null){
					focusView.requestFocus();
				}
				if (!error){
					cancel = true;
				}
				return cancel;
			}
		});
		// cancelar
		Button cancelarButton = (Button) dialog.findViewById(R.id.btn_cancel);
		cancelarButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// Close dialog
				dialog.cancel();
			}
		});

	}

	private String createDescripcionSeguimiento(String cadena) {
		String descripcionView = "";

		String[] arrayCadena = cadena.split(",");

		// En este momento tenemos un array en el que cada elemento es un color.
		for (int i = 0; i < arrayCadena.length; i++) {
			switch (i) {
			case 0:
				descripcionView += arrayCadena[i].toUpperCase();

				break;
			case 2:
				descripcionView += " - " + getString(R.string.variedad) + ": " + arrayCadena[i].toUpperCase();
				break;

			}
		}

		return descripcionView;

	}

	/**
	 * versionar la tabla
	 * 
	 * @param idLocal
	 * @param nameTable
	 * @return
	 */
	private int isVersion(int idLocal, String nameTable) {
		int version = 0;

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();

		gM = new GenericManager(db);
		String[] columnsU = { "_id", "is_version" };
		Cursor cu = gM.getObjectById(nameTable, columnsU, +idLocal);
		if (cu.moveToFirst()) {
			version = cu.getInt(cu.getColumnIndex("is_version"));
		}
		cu.close();
		gM.close();
		db.close();
		gestorDB.close();

		return version;
	}

}
